home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / cenvid / os2sessn.cmm < prev    next >
Text File  |  1995-09-27  |  6KB  |  174 lines

  1. // OS2Sessn.cmm - start a session in OS/2 and then return
  2. // ver.2          from DOS or Windows
  3.  
  4. if ( !defined(_DOS_) && !defined(_WINDOWS_) && !defined(_DOS32_) ) {
  5.    printf("\a\n");
  6.    puts("OS2Sessn.cmm starts session from within DOS or Windows")
  7.    puts("running under OS/2, and must be executed from CEnvi for")
  8.    puts("DOS or CEnvi for Windows");
  9.    exit(EXIT_FAILURE);
  10. }
  11.  
  12. Instructions()
  13. {
  14.    printf("\a\n");
  15.    puts(`OS2Sessn - Start an OS/2 session from DOS or Windows under OS/2`)
  16.    puts(``)
  17.    puts(`USAGE: CEnvi OS2Sessn <D|O|P|E|S><W|F><C|I><F|B><E|N> [Commands]`)
  18.    puts(``)
  19.    puts(`WHERE: D,O,P,E,S - DOS, OS/2, PM, Enhance Windows, or Standard Windows`)
  20.    puts(`       W,F - Windowed or Full-Screen`)
  21.    puts(`       C,I - Child or Independent; if child then return when child done`)
  22.    puts(`       F,B - Foreground or Background`)
  23.    puts(`       E,N - Environment inherited or no inherit environment`)
  24.    puts(`       Commands - Any command to pass on. Any two single qotes together ('')`)
  25.    puts(`                  row will be replace by a double quote(")`)
  26.    puts(``)
  27.    puts(`EXAMPLES: CEnvi OS2Sessn DFCFE edit.com c:\autoexec.bat`)
  28.    puts(`          CEnvi OS2Sessn OFIBN CMD.EXE SESSION /W /WIN /F WINFILE.EXE`)
  29.    puts(`          CEnvi OS2Sessn DFIBN COMPILE.EXE FOO.MAK`)
  30.    if ( defined(_WINDOWS_) && !defined(_SHELL_) ) {
  31.       printf("Press any key to exit...");
  32.       getch();
  33.    }
  34.    exit(EXIT_FAILURE);
  35. }
  36.  
  37. main(argc,argv)
  38. {
  39.    if ( argc < 2  ||  5 != strlen(Flags=strupr(argv[1])) ) {
  40.       printf("\nUnknown flags (First parameter).\n");
  41.       Instructions();
  42.    }
  43.    if ( !strchr("DOPES",SessionType=Flags[0]) ) {
  44.       printf("\nUnknown Session Type \"%c\", must be D, O, P, E, or S\n",SessionType);
  45.       Instructions();
  46.    }
  47.    if ( !strchr("WF",SessionSize=Flags[1]) ) {
  48.       printf("\nUnknown Session Size \"%c\", must be W or F\n",SessionSize);
  49.       Instructions();
  50.    }
  51.    if ( !strchr("CI",SessionRelation=Flags[2]) ) {
  52.       printf("\nUnknown Session Relation \"%c\", must be C or I\n",SessionRelation);
  53.       Instructions();
  54.    }
  55.    if ( !strchr("FB",SessionPriority=Flags[3]) ) {
  56.       printf("\nUnknown Session Priority \"%c\", must be F or B\n",SessionPriority);
  57.       Instructions();
  58.    }
  59.    if ( !strchr("EN",SessionEnvironment=Flags[4]) ) {
  60.       printf("\nUnknown Session Environment \"%c\", must be E or N\n",SessionEnvironment);
  61.       Instructions();
  62.    }
  63.  
  64.    BuildCommand(argc-2,argv+2,Title,Program,Parameters);
  65.  
  66.    StartData = BuildStartData(SessionType,SessionSize,SessionRelation,SessionPriority,
  67.                               SessionEnvironment,Title,Program,Parameters);
  68.  
  69.    // call the interrupt to start this block
  70.    reg.ah = 0x64;
  71.    reg.bx = 0x25;    // API ordinal
  72.    reg.ch = 'c', reg.cl = 'l';
  73.    if !defined(_DOS32_)
  74.       reg.ds = segment(StartData), reg.si = offset(StartData);
  75.    else
  76.       reg.dx = pointer(StartData);
  77.    interrupt(0x21,reg);
  78. }
  79.  
  80. BuildStartData(Type,Size,Relationship,Priority,Environment,Title,Program,Parameters)
  81. {
  82.    BLObPut(sdata,0,UWORD16);  // size of structure, add later
  83.    BLObPut(sdata,Relationship == 'C' ? 1 : 0,UWORD16);
  84.    BLObPut(sdata,Priority == 'F' ? 0 : 1,UWORD16);
  85.    BLObPut(sdata,0,UWORD16);  // no trace
  86.    BLObPut(sdata,Title ? pointer(Title) : NULL,UWORD32);
  87.    if ( Type == 'E' || Type == 'S' ) {
  88.       // windows program start WIN.COM
  89.       if ( Program ) {
  90.          if ( Parameters )
  91.             sprintf(Parameters,"%s %s",Program,Parameters);
  92.          else
  93.             strcpy(Parameters,Program);
  94.       }
  95.       if ( Type == 'E' ) {
  96.          if ( Parameters )
  97.             sprintf(Parameters,"/3 %s",Parameters);
  98.          else
  99.             Parameters = "/3";
  100.       }
  101.       Program = "WIN.COM";
  102.    }
  103.    BLObPut(sdata,Program ? pointer(Program) : NULL,UWORD32);
  104.    BLObPut(sdata,Parameters ? pointer(Parameters) : NULL,UWORD32);
  105.    BLObPut(sdata,0,UWORD32);  // TERMQ
  106.    BLObPut(sdata,0,UWORD32);  // pointer to environment
  107.    BLObPut(sdata,Environment == 'E' ? 1 : 0,UWORD16);
  108.    // finally, determine program type
  109.    #define SESSION_DEFAULT             0
  110.    #define SESSION_OS2_FULLSCREEN      1
  111.    #define SESSION_WINDOWABLEVIO       2
  112.    #define SESSION_PM                  3
  113.    #define SESSION_DOS_FULLSCREEN      4
  114.    #define SESSION_DOS_WINDOWED        7
  115.    switch( Type ) {
  116.       case 'D':
  117.          SessionType = ( Size == 'F' ? SESSION_DOS_FULLSCREEN : SESSION_DOS_WINDOWED );
  118.          break;
  119.       case 'O':
  120.          SessionType = ( Size == 'F' ? SESSION_OS2_FULLSCREEN : SESSION_WINDOWABLEVIO );
  121.          break;
  122.       case 'P':
  123.          SessionType = 3;
  124.          break;
  125.       case 'E':
  126.       case 'S':
  127.          if ( Size == 'F' ) {
  128.             SessionType = SESSION_DOS_FULLSCREEN;
  129.             break;
  130.          }
  131.          printf("\a\nOS2Sessn does not directly start Windows in Seamless mode.\n")
  132.          printf("You may try starting and OS/2 session with a START or SESSION\n");
  133.          printf("command.\n");
  134.          if ( defined(_WINDOWS_) ) {
  135.             printf("Press any key to exit...");
  136.             getch();
  137.          }
  138.          exit(EXIT_FAILURE);
  139.    }
  140.    BLObPut(sdata,SessionType,UWORD16);
  141.    // go back and add size
  142.    BLObPut(sdata,0,BLObSize(sdata),UWORD16);
  143.    return sdata;
  144. }
  145.  
  146.  
  147. BuildCommand(argc,argv,Title,Program,Parameters)
  148. {
  149.    if ( !argc ) {
  150.       Program = Parameters = Title = NULL;
  151.    } else {
  152.       Program = argv[0];
  153.       // build title as root name of command
  154.       Title = SplitFileName(Program).name;
  155.       if ( argc == 1 )
  156.          Parameters = NULL;
  157.       else {
  158.          Parameters = "";
  159.          for ( i = 1; i < argc; i++ ) {
  160.             strcat(Parameters," ");
  161.             strcat(Parameters,argv[i]);
  162.          }
  163.          Parameters;
  164.          // turn any double single-quotes into a double-quote
  165.          s = Parameters;
  166.          while ( s = strstr(s,"\'\'") ) {
  167.             strcpy(s,s+1);
  168.             s[0] = '\"';
  169.          }
  170.       }
  171.    }
  172. }
  173.  
  174.